package de.mnit.basis.daten.struktur.schluessel;

import de.mnit.basis.daten.struktur.gruppe.Gruppe2;
import de.mnit.basis.daten.struktur.liste.Liste;
import de.mnit.basis.daten.struktur.liste.S_Liste;
import de.mnit.basis.fehler.Fehler;


/**
 * @author Michael Nitsche
 */
public class SchluesselListe<TA,TB> extends A_Schluessel_LM_Basis<TA,TB> implements S_SchluesselListe<TA,TB> {

	public SchluesselListe() {
		super();
		this.objekte = Liste.neu();
	}


	public static final <TA,TB> SchluesselListe<TA,TB> neu() {
		return new SchluesselListe<TA,TB>();
	}

	public static final <TA,TB> SchluesselListe<TA,TB> neu(Class<TA> a, Class<TB> b) {
		return neu();
	}


	public S_Liste<TB> gObjekte() {
		return (S_Liste<TB>)objekte.kopie();
	}

	public S_Liste<TA> gSchluessel(TB objekt) {
		S_Liste<TA> erg=Liste.neu();
		for(int i=1; i<=this.objekte.gLaenge(); i++)
			if(this.objekte.gib(i).equals(objekt))
				erg.plus(this.gSchluessel().gib(i));
		return erg;
	}

	public void sortiereSo(int[] so) {
		if(this.geschuetzt)
			throw Fehler.sicherheit.da_Geschuetzt();
		throw Fehler.sonstige.da_ToDo();
	}

	public S_SchluesselListe<TA, TB> kopie() {
		S_SchluesselListe<TA, TB> erg=SchluesselListe.neu();
		for(Gruppe2<TA, TB> g : this)
			erg.plus(g.g1(), g.g2());
		return erg;
	}
}
